package jp.syuriken.snsw.terenaibot;

/**
 * ラッパ例外
 * 
 * @author $Author: snswinhaiku.lo@gmail.com $
 * @version 0.3
 */
@SuppressWarnings("serial")
public abstract class WrapperException2 extends WrapperException {
	
	/**
	 * TODO snsoftware
	 * 
	 * @author $Author: snswinhaiku.lo@gmail.com $ */
	public enum ErrorReason {
		/** 重複するポスト */
		DUPLICATE,
		/** API規制 */
		EXCEED_API_LIMITATION,
		/** ポスト規制 */
		OVER_POST_LIMITATION,
		/** 長すぎる (ポストなどが) */
		TOO_LONG,
		/** 見つからない (削除された？) */
		NOT_FOUND,
		/** リクエストは許可されていない */
		FORBIDDEN,
		/** ネットワーク上の問題 */
		NETWORK_ISSUE,
		/** 500: Internal Server Error (Something is broken.) */
		INTERNAL_SERVER_ERROR,
		/** 502: Bad Gateway (Twitter is down or being upgraded.)*/
		BAD_GATEWAY,
		/** 503: Service Temporarily Unavailable */
		SERVICE_UNAVAILABLE,
		/** 不明 */
		UNKNOWN;
		
		@Override
		public String toString() {
			String string;
			switch (this) {
				case DUPLICATE:
					string = "Status is a duplicate.";
					break;
				case EXCEED_API_LIMITATION:
					string = "Exceed API Limitation.";
					break;
				case OVER_POST_LIMITATION:
					string = "Over Post Limitation.";
					break;
				case TOO_LONG:
					string = "Too long.";
					break;
				case NOT_FOUND:
					string = "Not found.";
					break;
				case NETWORK_ISSUE:
					string = "Network issue.";
					break;
				case FORBIDDEN:
					string = "Forbidden";
					break;
				case INTERNAL_SERVER_ERROR:
					string = "Internal Server Error";
					break;
				case BAD_GATEWAY:
					string = "Bad Gateway";
					break;
				case SERVICE_UNAVAILABLE:
					string = "Service Temporarily Unavailable.";
					break;
				case UNKNOWN:
				default:
					string = name();
			}
			return string;
		}
	}
	

	private ErrorReason errorReason = ErrorReason.UNKNOWN;
	

	protected WrapperException2() {
		super();
	}
	
	/**
	 * インスタンスを生成する。
	 * 
	 * @param exception 例外
	 */
	protected WrapperException2(Throwable exception) {
		super(exception);
	}
	
	@Override
	public final boolean exceededRateLimitation() {
		return errorReason == ErrorReason.EXCEED_API_LIMITATION;
	}
	
	@Override
	public abstract String getErrorDescription();
	
	@Override
	public abstract String getErrorName();
	
	public ErrorReason getErrorReason() {
		return errorReason;
	}
	
	@Override
	public String getLocalizedMessage() {
		return String.format("%s:(%s) %s", getStatusCode(), getErrorName(), getErrorDescription());
	}
	
	/**
	 * RateLimitStatusを取得する。ない場合null
	 * 
	 * @return RateLimitStatusオブジェクト。
	 */
	@Override
	public abstract Object getRateLimitStatus();
	
	/**
	 * ステータスコードを取得する。
	 * 
	 * @return ステータスコード。
	 */
	@Override
	public abstract int getStatusCode();
	
	@Override
	public final boolean isCausedByNetworkIssue() {
		return errorReason == ErrorReason.NETWORK_ISSUE;
	}
	
	protected void setErrorReason(ErrorReason value) {
		errorReason = value;
	}
}
